/**
 * 解构赋值
 * 数组、对象
 */

// 数组的解构赋值
let [a, b, c] = [1, 2, 3]
console.log(a, b, c)  //1 2 3
let [d, e, [f, [g]]] = [1, 2, [3, [4]]]
console.log(d, e, f, g) //1 2 3 4
let [, , h, hh] = ['hello', 'java', 'script']
console.log(h, hh)  // script undefined
let [i, ...j] = ['first', 'second', 'finally']
console.log(i, j) // first [ 'second', 'finally' ]

/** 对象的解构赋值
 * 数组的元素是按次序排列的，变量的取值是由它的位置决定的：
 * 而对象的属性没有次序，变量必须与--属性同名--才能取到正确的值。
 */
let person = {
  name: '张三',
  age: 18,
  depobj: {
    deep: true
  },
  arr: ['hello', 'world']
}
let {name, age} = person
console.log(name, age)  // 张三 18

let {name: uname} = person // 属性取别名
console.log(uname)  // 张三

// 对象嵌套解构
let {depobj: {deep}, arr: [a1, a2]} = person
console.log(deep, a1, a2) // true hello world

// 字符串解构
const [s1, s2, s3, s4, s5] = 'hello'
console.log(s1, s2, s3, s4, s5) // h e l l o
const {length: len} = 'javascript'
console.log(len) //10


// 函数参数的解构
function add([a, b]) {
  return a + b
}

console.log(add([1, 2])) // 3

// 也可以使用默认值
function move({x = 0, y = 0} = {}) {
  console.log([x, y])
  return [x, y]
}

move({x: 1, y: 2}) //[ 1, 2 ]
move() // [ 0, 0 ]
move({x: 3}) //[ 3, 0 ]
move({})  //[ 0, 0 ]

/**
 * 用途：变量交换、函数返回多个值、函数参数定义、
 * 提取json数据、函数参数默认值、遍历map结构、import导入指定方法
 */

// 1、交换变量
let x = 1, y = 2
let [x1, y1] = [y, x]
console.log(x1, y1) // 2 1

// 2、函数返回多个值
function demo() {
  return [1, 2, 3]
}

let [d1, d2, d3] = demo()
console.log(d1, d2, d3) //1 2 3

function demo2() {
  return {
    d_name: 'zhangsan',
    d_age: 20
  }
}

let {d_name, d_age} = demo2()
console.log(d_name, d_age)  //zhangsan 20

// 3、函数参数定义
function demo3({a, b, c}) {
  return [a, b, c]
}

console.log(demo3({a: 1, b: 2, c: 3}))  // [ 1, 2, 3 ]

// 4、提取json数据
let jsonObj = {
  status: 'ok',
  data: [
    {
      j_name: 'json',
      j_title: 'first_json',
      j_arr: [1, 2, 3, 4, 5]
    }
  ]
}
let {status, data: [{j_name, j_arr}]} = jsonObj
console.log(status, j_name, j_arr) // ok json [ 1, 2, 3, 4, 5 ]

// 遍历map结构
let map = new Map()
map.set('m_name', 'lisa')
map.set('m_age', 22)
console.log(map) //Map(2) { 'm_name' => 'lisa', 'm_age' => 22 }

for (let [key, value] of map) {
  console.log('key:', key, ';value:', value)
}
// key: m_name ;value: lisa
// key: m_age ;value: 22







